package com.learning.demos;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * @author adolphw
 *
 * 1 继承thread类
 * 2 实现 runable接口 没有返回值
 * 3 线程池 Callable
 *
 * 多线程中，第三种获得多线程的方式
 */
public class CallableDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask<Integer> futureTask = new FutureTask<>(new MyThread2());

        // 多个线程抢一个future task 只有运行一个
        new Thread(futureTask,"aa").start();
        new Thread(futureTask,"bb").start();

        int r1 = 100;
        // 要求获得callable线程的计算结果，如果没有计算完成就去要去强求，会导致堵塞，直到计算完成
        // 尽量放到最后，给其他线程时间
        int r2 = futureTask.get();
        //

//        while (!futureTask.isDone()) {
//
//        }
        System.out.println("main*************");
        System.out.println("返回值：" + (r1 + r2));

    }
}


class MyThread implements Runnable{
    @Override
    public void run() {

    }
}

class MyThread2 implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        System.out.println("come in callable");
        TimeUnit.SECONDS.sleep(3);
        return 1024;
    }
}
